1 Objectif : Dynamique de population des poissons d’eau douce de Bretagne

Script : 00_selection_pop_ope

L’objectif de cette étude est d’évaluer les tendances démographiques des poissons d’eau douce de Bretagne. Ce travail vient en appui à la révision de la liste rouge régionale de 2015.

Dans un premier temps, il s’agit de produire un tableau de bord combinant divers indicateurs simples représentatifs de la dynamique de population des poissons d’eau douce de Bretagne de 1990 à 2023.

Ce script vise à constituer un premier jeu de données regroupant une sélection de stations bretonnes à étudier, tirées de la base nationale ASPE. Ces données serviront ensuite à construire des séries temporelles représentatives des populations de poissons d’eau douce en Bretagne. Elle permettrons ainsi une première évaluation simple et globale des populations de poissons d’eau douce de Bretagne.

Dans un second temps (à partir du script 15), une analyse plus fine de ces dynamiques populationnelles sera effectuée à l’aide d’outils bayésiens développés par Dortel et al., 2022.

2 Installation

2.1 Chargement des packages, fonctions et des données

# Chargement des packages
library(tidyverse)
library(wesanderson) # Palette de couleur
library(aspe) # Traitement de la base aspe
library(mapview)
library(COGiter)
library(sf)
# Chargement des fonctions 
source(file = "../R/borner_series.R")
# Chargement des données 
rdata_tables <- misc_nom_dernier_fichier(
  repertoire = "../../../../projets/ASPE/raw_data/rdata",
  pattern = "^tables")
load(rdata_tables)
# Chargement des palettes de couleur 
pal <- wes_palette("AsteroidCity1")
pal2 <- wes_palette("FantasticFox1")
pal3 <- c("#007844", "#92D050", "#0087C1", "#A97B30","#FCEE21", "#00AEEF", "#1D1D1B", "#B9D9EB")

2.2 Paramètres

Plusieurs paramètres sont définis pour cette étude. Ils peuvent être modifiés en fonction des objectifs et des préférences. Parmi ces paramètres :

  • La taille du buffer (en mètres) : zone tampon entourant les départements de la Bretagne.

  • Les réseaux de pêches : sélection des différents réseaux : RCS - Réseau de Contrôle de Surveillance ; RRP - Réseaux de Référence Pérenne ; RHP - Réseau Hydrobiologique Piscicole ; RCA - Réseau de contrôle additionnel ; RCO – Réseau Contrôle opérationnel. Seuls les trois premiers réseaux sont conservés dans cette étude.

  • Les types de pêches : sélection des différents types de pêche : pêche partielle par point, pêche par ambiance, pêche partielle sur berge, pêche complète à un ou plusieurs passages.

  • Le nombre minimum d’années composant les séries de pêches.

  • Le nombre d’années manquantes consécutives maximum sur les séries de pêches.

## Taille du buffer (en mètres) 
taille_buffer <- 1000

## Réseaux de pêches
mes_reseaux <- c("RCS – Réseau de Contrôle de Surveillance",
                 "RRP – Réseau de Référence Pérenne",
                 "RHP – Réseau Hydrobiologique Piscicole")

## Types de pêches 
mes_types_de_peche <- c("Pêche complète à un ou plusieurs passages",
                   "Pêche partielle par points (grand milieu)",
                   "Pêche par ambiances",
                   "Pêche partielle sur berge")

## Nombre minimum d'années des séries de pêches 
n_mini_annee <- 9 

## Nombre d'années manquantes maximum consécutives sur les série de pêches 
n_max_manquant <- 2

## Année de départ de l'étude
annee_depart <- 1990 # Année de départ de l'étude fixée à 1990

## Année de fin de l'étude
annee_fin <- 2023 # Année de fin de l'étude fixée à 2023

3 Constitution du jeu de données

Il s’agit de créer une passerelle qui permettra de joindre l’ensemble des différentes données retenues pour les futurs analyses. Cette passerelle facilitera l’ajout d’autres tables de données contenant diverses informations sur les stations/opérations/poissons issues de la base ASPE (utilisation de la fonction “mef_ajouter_…” pour ajouter de nouvelles tables à notre jeu de données).

## Création d'une passerelle ----
passerelle <- mef_creer_passerelle()

3.1 Sélection de l’aire géographique

Pour notre étude, nous nous concentrons sur la Bretagne, incluant les départements 22, 29, 35 et 56.

## Sélection de l'aire géographique : choix des départements ----
# Pour notre étude : La Bretagne (22, 29, 35, 56)
mes_depts <- departements_metro_geo %>% 
  filter (DEP %in% c("22", "29", "35", "56"))
# Visualisation de la zone géographique sélectionnée ----
mes_depts %>%
  mapview::mapview()

3.2 Mise en place du buffer

Notre étude se concentre sur la Bretagne. Toutes les stations bretonnes sont regroupées dans un jeu de données initial. Ici, il ne s’agit pas de réfléchir à l’échelle des bassins versants, leurs limites n’étant pas toujours évidentes. Un buffer est donc mis en place autour des limites départementales pour considérer les stations aux emplacements ambigus et englober les stations frontalières. La taille du buffer est définie selon l’aire géographique considérée (cf. Paramètres).

## Mise en place d'un buffer ----
buffer <- st_buffer(mes_depts, 
                      taille_buffer) # PARAMETRE
# Visualisation de l'aire géographique et du buffer ----
mapview(
  list(buffer, mes_depts),
  layer.name = c("Bretagne avec un buffer de 1 km", "Bretagne"),
  col.regions = list("#0A9F9D", "#FDE725FF")
)

3.3 Points de prélèvements

Nous souhaitons maintenant observer l’ensemble des stations / points de prélèvements (lieux des opérations de pêches) présents sur cette aire géographique précèdemment sélectionnée. Les points de prélèvements - contenus dans le dataframe pop_depts sont alors représentés au sein de cette aire géographique.

# Visualisation des points de prélèvements présents dans l'aire géographique sélectionnée
pop_depts <- point_prelevement %>%
  st_as_sf(coords = c("pop_coordonnees_x",
                      "pop_coordonnees_y"),
               crs = 2154) %>% 
  geo_attribuer(buffer) %>% 
  filter(!is.na(DEP))

mapview(
  list(buffer, mes_depts),
  layer.name = c("Bretagne avec un buffer de 1 km", "Bretagne"),
  col.regions = list("#0A9F9D", "#FDE725FF")
) + mapview (pop_depts, shape = 20, color = "darkred", lwd =1)

Il est ainsi observé le nombre de points de prélèvements ainsi que le nombre de stations au sein de cette aire géographique. Une station peut contenir plusieurs points de prélèvements (l’inverse n’est en revanche pas possible - si c’est le cas, cf dernière partie “Vérification des données”). Après visualisation de l’aire géographique et de ses points de prélèvements associés, une sauvegarde des pop_id est réalisée dans la passerelle.

# Sauvegarde des points de prélèvements sélectionnés dans la passerelle 
passerelle <- passerelle %>%
  filter(pop_id %in% pop_depts$pop_id)

Il est important de noter que les sta_id et les pop_id sont donc liés. Lorsque qu’il est mentionné “calcul au point de prèlevement”, cela peut aussi faire référence à la station puisqu’ils désignent le même lieu.

3.4 Réseaux de pêche

Il existe plusieurs types de réseaux de pêches en France. Chaque point de prélèvement (pop_id) correspond à un ou plusieurs types de réseaux de pêche. Ces différents réseaux sont identifiables par leurs obj_libelle - “objectif libelle”. Nous ajoutons cette information dans notre jeu de données à l’aide la passerelle (“mef_ajouter_objectif”), et nous sélectionnons seulement les réseaux souhaités pour l’étude : ici le RCS, le RHP et le RRP.

## Sélection des réseaux de pêche
passerelle <- passerelle %>%
  mef_ajouter_objectif() %>% 
  filter(obj_libelle %in% mes_reseaux)   # PARAMETRE

3.4.1 But des différents réseaux sélectionnés : RHP, RCS et RRP

Dans le but d’évaluer l’état et l’évolution des peuplements piscicoles et de caractériser les perturbations subies par les écosystèmes aquatiques continentaux, un réseau de surveillance, le Réseau Hydrobiologique et Piscicole (RHP), a été mis en place - depuis 1990.

Le réseau de Contrôle de Surveillance (RCS) visant à évaluer la qualité des milieux et leur degré d’altérations est mis en place depuis l’année 2007.

Le réseau de réference Perrenne (RPP) est mis en place depuis l’année 2013.

3.5 Types de pêche

Sur chacun des points de prélèvements sélectionnés, des opérations de pêche sont réalisées. Les opérations de pêches portent toutes un numéro d’identifiant unique (1 ope_id = 1 pêche). Différents types de pêche, c’est à dire utilisant des protocoles différents peuvent être réalisées au sein d’une même station ou d’un même point de prélèvement. L’utilisation de différentes techniques de pêches sont identifiables par un pro_libelle - pour protocole libelle - attaché à une opération de pêche.

Nous ajoutons cette information dans notre jeu de données à l’aide la passerelle (“mef_ajouter_type_protocole”), et nous sélectionnons seulement les types de pêches souhaitées pour l’étude : la “Pêche complète à un ou plusieurs passages”, la “Pêche partielle par points (grand milieu)”, la “Pêche par ambiances” et la “Pêche partielle sur berge”.

## Création d'un dataframe "mes_ope" et sélection des types de pêches ---- 
ope_pro_libelle <- passerelle %>% 
  mef_ajouter_type_protocole() %>%
  filter(pro_libelle %in% mes_types_de_peche) %>%  # PARAMETRE
  select(sta_id:ope_id, pro_libelle) %>% 
  distinct()

3.6 Opération de pêche

Pour chaque point de prélèvement (pop_id), plusieurs opérations de pêche peuvent être réalisées une même année. Afin de garder une cohérence dans notre jeu de données, nous souhaitons seulement conserver l’opération de pêche la plus tardive de l’année étudiée.

## Sélection d'une seule pêche par années, par point de prélèvement

ope_selection <- ope_pro_libelle %>%
  mef_ajouter_ope_date() %>% 
  group_by(pop_id, annee) %>% 
  filter(ope_date == max(ope_date)) # Pour le cas des sites avec plusieurs pêches la même année, on sélectionne par défaut la pêche la plus tardive

Ainsi, nous devons maintenant avoir une seule opération de pêche (ope_id) par année et par point de prélèvement.

Nous souhaitons maintenant nous concentrer sur notre période d’étude. Nous réduisons le jeu de données à notre année de départ et à notre année de fin (ici de 1990 à 2023).

# On réduit le jeu de donnée à notre année de départ  et de fin (paramètre)
ope_selection <- ope_selection %>% 
  filter(annee >= annee_depart, # Année de départ (paramètre)
         annee <= annee_fin)    # Année de fin (paramètre)

3.7 Caractéristiques des séries temporelles

Nous souhaitons sélectionner les sites (sta_id / pop_id) qui ont été suivis pendant suffisamment longtemps pour constituer des séries temporelles robustes. Nous identifions le nombre d’années de données disponibles par point de prélèvement et appliquons des critères de sélection basés sur la durée et la continuité des suivis.

Afin d’obtenir une robustesse statistique suffisante, une sauvegarde des stations avec au moins 10 années de données sur un même point de prélèvement est appliquée (utilisation de la fonction “borner_series”).

## Sélection des stations ayant au moins 10 années de données sur un même pop_id - avec 2 années maximum de suivis consécutifs manquants 

pop_serie_tempo <- ope_selection %>%
  borner_series(var_id_site = pop_id,  #Utilisation de la fonction "borner_series"
                var_temp = annee,
                max_nb_obs_manquantes = n_max_manquant) # PARAMETRE
pop_serie_tempo <- pop_serie_tempo %>%
  filter(n_opes > n_mini_annee) %>% # PARAMETRE
  select(-annee_mini) %>% 
  pull(pop_id)

Le dataframe pop_serie_tempo contient maintenant les séries temporelles à etudier. Il contient donc l’ensemble des points de prélèvements (pop_id) que nous avons retenus à l’issu de l’application de nos critères de sélections (paramètres). Nous réalisons une mise à jour du jeu de données ope_selection, en ne selectionnant que les pop_id retenus précèdemment :

ope_selection <- ope_selection %>% 
  filter(pop_id %in% pop_serie_tempo) %>% # Sélection des pop_id contenus dans la sélection de séries temporelles
  mef_ajouter_libelle_site() # Ajout des libellés du site 

ope_selection contient l’ensemble des stations (sta_id), des points de prélèvements (pop_id) et enfin des opérations (ope_id) que nous étudierons.

3.7.1 Représentation graphique

Nous réalisons une représentation graphique des séries temporelles constituées. Nous ajoutons les types de pêches (pro_libelle) associées aux opérations des séries. En amont, les libellés des points de prélèvements sont remis en forme et rajoutés dans le jeu de données ope_selection.

# Définir les règles de modification des libellés
regles_modification <- tribble(
  ~ancien_libelle,                        ~nouveau_libelle,
  "VILAINE à SAINTE-MARIE",               "Vilaine à Sainte-Marie",
  "Le Semnon à Poligne",                  "Semnon à Poligne",
  "L'Aulne à Locmaria-berrien",           "Aulne à Locmaria-berrien",
  "La Claie à Pleucadeuc",                "Claie à Pleucadeuc",
  "Le Ruisseau de Loup à Plougonver",     "Ruisseau de Loup à Plougonver",
  "La Cantache à Dompierre-du-chemin",    "Cantache à Dompierre-du-chemin",
  "La Rivière de Pont l'abbé à Peumerit", "Rivière de Pont l'abbé à Peumerit",
  "Le Kerambellec à Brasparts",           "Kerambellec à Brasparts",
  "Le Gouessant à Andel",                 "Gouessant à Andel",
  "La Vilaine à Chateaubourg",            "Vilaine à Chateaubourg",
  "L'Arguenon à Dolo",                    "Arguenon à Dolo",
  "Le Ruisseau la Mignonne (bras naturel ou aménagé) à Saint-urbain", "Ruisseau la Mignonne à Saint-urbain",
  "Le Jet (bras naturel ou aménagé) à Elliant",  "Jet à Elliant",
  "L'Ille à Montreuil-sur-ille",          "Ille à Montreuil-sur-ille",
  "L'Ével à Baud",                        "Ével à Baud",
  "L' Aven à Melgven",                    "Aven à Melgven",
  "Le Guyoult à Mont-dol",                "Guyoult à Mont-dol",
  "La Rance à Ereac",                     "Rance à Ereac",
  "Le Couesnon à Romazy",                 "Couesnon à Romazy",
  "L' Inam à Lanvenegen",                 "Inam à Lanvenegen",
  "Le Nanson à Parigne",                  "Nanson à Parigne",
  "LEGUER à PLOUBEZRE",                   "Leguer à Ploubezre",
  "TRIEUX à PLESIDY",                     "Trieux à Plesidy",
  "Le Larhon à Saint-maudan",             "Larhon à Saint-maudan",
  "Le Kersault à Locarn",                 "Kersault à Locarn",
  "La Sarre à Melrand",                   "Sarre à Melrand",
  "Le Ruisseau le Sedon à Guegon",        "Ruisseau le Sedon à Guegon",
  "L'Ellé au Faouet",                     "Ellé au Faouet",
  "L'Élorn à la Roche-maurice",           "Élorn à la Roche-maurice",
  "L' Aër au Croisty",                    "Aër au Croisty",
  "La Vilaine à  Guichen",                "Vilaine à Guichen",
  "Le Ruisseau l' Yvel à Neant-sur-yvel", "Ruisseau Yvel à Neant-sur-Yvel",
  "L'Élorn à Commana",                    "Élorn à Commana",
  "L'Horn à Mespaul",                     "Horn à Mespaul",
  "Le Tarun à Plumelin",                  "Tarun à Plumelin",
  "ISOLE à SAINT-THURIEN",                "Isole à Saint-Thurien",
  "L'Aff à Paimpont",                     "Aff à Paimpont",
  "LIE à LA PRENESSAYE",                  "Lié à la Prenessaye",
  "Le Gozvoalet à Langonnet",             "Gozvoalet à Langonnet",
  "GARVAN A DINEAULT",                    "Garvan à Dineault",
  "MILIN PRAT A LOGUIVY-PLOUGRAS",        "Milin Prat à Loguivy-Plougras",
  "MARZAN À MARZAN",                      "Marzan à Marzan")

ope_selection <- ope_selection %>%
  left_join(regles_modification, by = c("pop_libelle" = "ancien_libelle")) %>% # Ajout des nouveaux libellés
  mutate(n_pop_libelle = coalesce(nouveau_libelle, pop_libelle)) %>%
  select(-nouveau_libelle,
         -pop_libelle) %>% 
  rename(pop_libelle = n_pop_libelle)

Représentation graphique des séries temporelles sélectionnées :

## Représentation graphique des stations sélectionnées et des types de pêches associées ----

ope_selection %>% 
  ggplot(aes(x = as.character(pop_libelle),
             y = annee, 
             fill= pro_libelle),
         legend.background = element_rect(fill="#ffffff")) + 
  scale_fill_manual(values= pal) +
  geom_tile() +
  labs(title = "Les points de prélèvements sélectionnés et les types de pêches associées",
       subtitle = "Région Bretagne", 
       x ="",
       y = "Années",
       fill = "Type de pêche") + 
  theme_light(base_size = 11) +
  theme(panel.grid.major = element_line(color="#ffffff", size = 0.1),
        panel.grid.minor = element_line(color = "#ffffff"),
        panel.background = element_rect(fill="#faf0e6"),
        legend.position = "bottom") +
  coord_flip() +
  scale_y_continuous(breaks = seq(min(ope_selection$annee), max(ope_selection$annee), by = 3))

3.8 Effort de pêche

Nous souhaitons visualiser les différents efforts de pêche par points de prélèvements sélectionnés. Il s’agit d’observer si un déséquilibre se dessine entre les stations sélectionnées et l’ensemble du territoire couvert par l’étude.

ope_selection_sta <- ope_selection %>%
  group_by(sta_id) %>% 
  mutate(nb_ope_par_sta = n_distinct(ope_id)) %>% # Calcul du nombre distinct d'opérations
  select(sta_id, ope_id, pop_id, nb_ope_par_sta) %>%
  left_join(point_prelevement) %>% 
  sf::st_as_sf(coords = c("pop_coordonnees_x", 
                           "pop_coordonnees_y"),
                crs = 2154) %>% 
  aspe::geo_attribuer(buffer)

# Pour la visualisation graphique je n'ai besoin que d'un seul exemple d'ope_id par station
sta_id_ope_selection <- ope_selection_sta %>% 
  group_by(sta_id) %>% 
  sample_n(1) %>% 
  ungroup()

# Visualisation de l'effort de pêche
mapview(list(buffer, mes_depts),
        layer.name = c("Bretagne avec un buffer de 1 km", "Bretagne"),
        col.regions = list("#440154FF", "#FDE725FF")) + 
  mapview(sta_id_ope_selection,
          layer.name = "Nombre operation par station", 
          size_var = "nombre_ope_sta",
          cex = "sta_id",
          lwd = 0.2,
          col.regions = "#D693E0",
          alpha = 0.8,
          legend = TRUE,
          labels = list(text = sta_id_ope_selection$nb_ope_par_sta, cex = 1.5))

Nous enregistrons les opérations (ope_id) selectionnées dans la passerelle.

# Enregistrement des opérations de pêches retenues dans la passerelle
passerelle <- passerelle %>% 
  filter(ope_id %in% ope_selection$ope_id)

4 Vérification du jeu de données

Il s’agit de détecter des erreurs potentielles dans le jeu de données constitué.

4.1 Les points de prélèvements et les stations

Pour chacune des pêches réalisées, des points de prélèvement attachés à des stations sont inscrits dans la base. Il s’agit ici d’identifier, pour chaque station, combien de point de prélèvement sont associés. Le résultat permet une vérification des éventuels doublons.

Remarque : l’idée étant d’obtenir les séries chronologiques les plus longues, il est important de vérifier si une fusion de point de prélèvement est envisageable (en cas de proximité géographique). Il s’agit également d’identifier, pour chaque point de prélèvement, combien de station sont combinées (le résultat devant être égale à 1, sinon une erreur est probable).

4.1.1 Un point de prélèvement = Une station ?

Nous vérifions qu’un point de prélèvement (pop_id) est bien rattaché à une seule station (sta_id). Si ce n’est pas le cas, il s’agit d’une erreur dans la base de donnée qu’il est nécessaire de corriger pour la suite de l’étude.

### Recherche erreur : 1 point de prélèvement = 1 seule station ----

pop_plusieurs_sta <- ope_selection %>% 
  mef_ajouter_libelle_site(origine_libelle = "station_sandre") %>% 
  rename(sta_libelle = sta_libelle_sandre) %>%  
  mef_ajouter_libelle_site(origine_libelle = "auto") %>% 
  select(-pro_libelle, -ope_id) %>% 
  distinct()

pop_plusieurs_sta <- pop_plusieurs_sta %>% 
  group_by(pop_id) %>% 
  summarise(n_sta = n_distinct(sta_id)) %>% 
  filter(n_sta>1, !is.na(pop_id)) %>% 
  pull(pop_id) %>% 
  length()

Nombre de points (pop_id) correspondant à plusieurs stations (sta_id) : 0

4.1.2 Un station = Un point de prélèvement ?

Nous vérifions qu’une station (sta_id) est bien rattaché à unpoint de prélèvement (pop_id). Si ce n’est pas le cas, il ne s’agit pas d’une erreur du jeu de données. Cependant, une optimisation potentielle peut être réalisée.

Dans certains cas pratiques, le point de prélèvement peut être amené à être légèrement déplacer d’une année à une autre (pour des contraintes techniques / humaines / …). Il s’agit d’étudier la possibilité, si les contextes des deux pop_id sont similaires, de rassembler ces points de prélèvements sous un seul identifiant afin de composer des séries temporelles plus longues.

### Recherche erreur : 1 station = ? opération(s) (vérification doublons) 
sta_plusieurs_pop <- ope_selection %>% 
  mef_ajouter_libelle_site(origine_libelle = "station_sandre") %>% 
  rename(sta_libelle = sta_libelle_sandre) %>%  
  mef_ajouter_libelle_site(origine_libelle = "auto") %>% 
  select(-pro_libelle, -ope_id) %>% 
  distinct()

sta_plusieurs_pop_1 <- sta_plusieurs_pop %>% 
  group_by(sta_id) %>% 
  summarise(n_pop = n_distinct(pop_id)) %>% 
  filter(n_pop>1, !is.na(sta_id)) %>% 
  pull(sta_id) %>% 
  unique()

sta_plusieurs_pop <- sta_plusieurs_pop %>% 
  ungroup() %>% 
  filter(sta_id %in% sta_plusieurs_pop_1) %>% 
  dplyr::select (sta_id, sta_libelle, pop_id, pop_libelle) %>% 
  dplyr::distinct() %>% 
  arrange(sta_libelle)

sta_plusieurs_pop %>% 
  flextable::flextable() %>% 
  flextable::autofit() %>% 
  flextable::colformat_int(j = c(1, 3), big.mark = " ")

sta_id

sta_libelle

pop_id

pop_libelle

5 Sauvegarde

# SAUVEGARDE ----
save(pop_serie_tempo,
     ope_selection,
     sta_id_ope_selection,
     passerelle,
     file = "../processed_data/selection_pop_ope.rda")

6 Sauvegarde pour la création de carte du script 01_production_carte_selection_station

save(sta_id_ope_selection,
     buffer,
     mes_depts,
     file = "../processed_data/selection_pop_ope_carte.rda")